﻿// Колесов 
using System;
using ComLaoBase;

namespace Transfer
{
    /// <summary> Класс обеспечивает работу с прейскурантами.
    /// Работа ведется напрямую с таблицами LAO без загрузки в DataTable. 
    /// </summary>
    public class LaoPrice
    {
        LAOBase _pricelist;     // Список прейскурантов
        LAOBase _ass;           // Позиции прейскуранта
        LAOBase _price;         // Цены по позиции
        
        public LaoPrice()
        {
            _pricelist = LAO_DB.Open("TSklPrcRstObj", "Index_2"); // Индекс по Rcd
            _ass = _pricelist.GetSubObject("TSklPrcObj");
            _price = _ass.GetSubObject("TSklPrcAObj");
        }

        public void Close()
        {
            _price.Close();
            _ass.Close();
            _pricelist.Close();
        }

        /// <summary> Получение Rcd прайс-листа по его шифру.
        /// </summary>
        /// <param name="code"></param>
        /// <returns></returns>
        public Int32 GetRcdByCode(string code)
        {
            Int32 rcd = 0;
            _pricelist.Sort("Index_1");     // Сортировка по шифру
            if (_pricelist.Find(1, code.Trim(), 0, 0, 0, 0, 0, 0, 0, 0, 0))
                rcd = _pricelist.GetInteger("Rcd");

            _pricelist.Sort("Index_2");     // Восстановим сортировку по Rcd
            return rcd;
        }

        /// <summary> Получение цены из прейскуранта.
        /// Из-за не совсем удачной организации прейскуранта в LAO
        /// поиск цены выполняется перебором. Может получиться не быстро.
        /// </summary>
        /// <param name="prc">Шифр прейскуранта или Rcd</param>
        /// <param name="art">Артикул номенклатуры</param>
        /// <param name="date">Дата, на которую нужна цена</param>
        /// <returns>Цена или ноль.</returns>
        public PricePrm GetPrice(string prc, string art, DateTime date)
        {
            return GetPrice(GetRcdByCode(prc), art, date);
        }
        public PricePrm GetPrice(int prc, string art, DateTime date)
        {
            PricePrm prcPrm = new PricePrm();
            prcPrm.RcdPrice = prc;
            // Ищем прейскурант по заданному Rcd
            if (!_pricelist.Find(1, prc, 0, 0, 0, 0, 0, 0, 0, 0, 0))
                return prcPrm;

            // Ищем артикул в прейскуранте.
            art = art.Trim();
            _ass.First();
            while (!_ass.IsEOO())   // Перебираем позиции номенклатуры в прейскуранте
            {
                if (_ass.GetString("Art","").Trim() == art) // Артикул найден.
                {
                    prcPrm.RcdEiPrc = _ass.GetInteger("Ei");

                    _price.First();
                    while (!_price.IsEOO()) // Перебираем историю цен (по возрастанию даты)
                    {
                        DateTime posDat = _price.GetDate("Dat");
                        if (posDat <= date)
                        {
                            prcPrm.Cena = Convert.ToDecimal(_price.GetDouble("Cn1B"));
                            prcPrm.RcdPosPrc = _price.GetInteger("Prc");
                        }
                        else
                            break;     // Пошли более поздние цены
                        
                        _price.Next();
                    }
                    break;
                }
                _ass.Next();
            }
            return prcPrm;
        }
    }

    /// <summary> Набор параметров, описывающих цену прейскуранта
    /// </summary>
    public class PricePrm
    {
        /// <summary> Rcd прейскуранта
        /// </summary>
        public int RcdPrice = 0;
        /// <summary> Цена
        /// </summary>
        public decimal Cena = 0;      
        /// <summary> Rcd позиции прейскуранта
        /// </summary>
        public int RcdPosPrc = 0;
        /// <summary> Rcd единицы измерения позиции прейскуранта.
        /// </summary>
        public int RcdEiPrc
        {
            get { return _rcdEiPrc; }
            set { _rcdEiPrc = value; }
        }
        private int _rcdEiPrc = 0;
    }
}
